#ifndef MAIN_H_
#define MAIN_H_

#include "zf_common_headfile.h"
#include "sj_imgproc.h"
#include <stdbool.h>
#include <stdint.h>

// =========================================================================
// ==================== 硬件引脚定义 (Hardware Pin Definitions) ====================
// =========================================================================
// (您的硬件定义完整保留，无需修改)

// --- 编码器引脚信息 ---
//两个编码器用于检测左右轮转动速度和距离
#define ENCODER_1 (QTIMER1_ENCODER1)
#define ENCODER_1_A (QTIMER1_ENCODER1_CH1_C0)
#define ENCODER_1_B (QTIMER1_ENCODER1_CH2_C1)
#define ENCODER_2 (QTIMER1_ENCODER2)
#define ENCODER_2_A (QTIMER1_ENCODER2_CH1_C2)
#define ENCODER_2_B (QTIMER1_ENCODER2_CH2_C24)

// --- 电机参数设置 ---
//控制左右驱动轮的 PWM 输出与方向控制引脚
// MOTORx_PWM，PWM 控制信号，PWM为脉冲信号占空比，
//不同PWM使得两轮转速不一致，实现差速转弯
// MOTORx_DIR，方向控制信号
#define MOTOR1_PWM (PWM2_MODULE0_CHA_C6)
#define MOTOR1_DIR (C7)
#define MOTOR1_FORWARD_DIR_LEVEL (GPIO_LOW) 
#define MOTOR2_PWM (PWM2_MODULE1_CHA_C8)
#define MOTOR2_DIR (C9)
#define MOTOR2_FORWARD_DIR_LEVEL (GPIO_HIGH)

// --- 舵机参数设置 ---
//控制转向舵机的 PWM 信号。
#define SERVO_MOTOR_PWM (PWM4_MODULE2_CHA_C30)
#define SERVO_MOTOR_FREQ (50)                 // 典型舵机频率：50Hz
#define SERVO_MOTOR_L_MAX (110)               // 舵机左转极限角度对应占空比
#define SERVO_MOTOR_R_MAX (71)                //同上
#define SERVO_DIR (SERVO_MOTOR_L_MAX > SERVO_MOTOR_R_MAX ? -1.0f : 1.0f)
#define SERVO_MOTOR_DUTY(x) ((float)PWM_DUTY_MAX / (1000.0 / (float)SERVO_MOTOR_FREQ) * (0.5 + (float)(x) / 90.0))
	// 限制舵机 PWM 频率范围，防止损坏
#if (SERVO_MOTOR_FREQ < 50 || SERVO_MOTOR_FREQ > 300)
#error "SERVO_MOTOR_FREQ ERROE! Please set a value between 50 and 300."
#endif


// =========================================================================
// ==================== 全局状态与数据 (Global States & Data) ====================
// =========================================================================
// 这些变量的【实体】都在 sj_image.c 中定义，这里只做【声明】，方便其他模块访问

// --- 图像处理相关的宏定义 ---
#define POINTS_MAX_LEN  (MT9V03X_H) // 确保所有文件都能使用这个宏


// --- 图像数据结构 ---
extern image_t img_raw;       //摄像头采集到的原始灰度图像。
extern image_t img_line;      //二值化等处理后的图像，用于巡线分析


// --- 图像处理结果变量 ---

// 原始图像点集，左线与右线像素坐标点
extern int ipts0[POINTS_MAX_LEN][2];
extern int ipts1[POINTS_MAX_LEN][2];
extern int ipts0_num, ipts1_num;

// 变换后点集，由原始坐标转化为俯视坐标
extern float rpts0[POINTS_MAX_LEN][2];
extern float rpts1[POINTS_MAX_LEN][2];
extern int rpts0_num, rpts1_num;

// 滤波后点集
extern float rpts0b[POINTS_MAX_LEN][2];
extern float rpts1b[POINTS_MAX_LEN][2];
extern int rpts0b_num, rpts1b_num;

// 重采样后点集
extern float rpts0s[POINTS_MAX_LEN][2];
extern float rpts1s[POINTS_MAX_LEN][2];
extern int rpts0s_num, rpts1s_num;

// 左右中线，最终用于控制算法的参考轨迹
extern float rptsc0[POINTS_MAX_LEN][2];
extern float rptsc1[POINTS_MAX_LEN][2];
extern int rptsc0_num, rptsc1_num;

// 角点信息
//在图像预处理中提取的关键特征点，用于检测拐角、直线段或十字结构
extern int Ypt0_rpts0s_id, Ypt1_rpts1s_id;
extern bool Ypt0_found, Ypt1_found;
extern int Lpt0_rpts0s_id, Lpt1_rpts1s_id;
extern bool Lpt0_found, Lpt1_found;
extern bool is_straight0, is_straight1;


// --- 控制相关 ---

// 巡线模式定义与声明
enum track_type_e {
    TRACK_LEFT,
    TRACK_RIGHT
    // 如果您的十字、环岛等模块需要，可以在这里添加更多模式
    // 例如 TRACK_STRAIGHT, TRACK_CIRCLE_IN 等
};
extern enum track_type_e track_type;
#define ROAD_WIDTH (0.4f)     // 道路宽度/m，用于计算左右线中点位置或转向角度换算等等

//图像算法参数，牵涉算法实现，较复杂
extern float thres;             // 二值化阈值，灰度图转为黑白图的分界值
extern float block_size;        // 自适应阈值块大小
extern float clip_value;        // 灰度截断上限（防止图像亮度过高导致过曝）
extern float begin_x;           // ROI 起始点（横向）
extern float begin_y;           // ROI 起始点（纵向）
extern float line_blur_kernel;  // 线条平滑卷积核大小，用以平滑图像，减少噪点
extern float pixel_per_meter;   // 像素与实际距离的换算系数
extern float sample_dist;       // 巡线采样点间距（像素距离）
extern float angle_dist;        // 前瞻点角度计算间距
extern float aim_distance;      // 纯跟踪算法的前瞻距离

extern bool line_show_sample; //是否显示采样点（调试开关），若为 true，屏中显示巡线算法采样点
#endif /* MAIN_H_ */